package shopping.web.servlet;

import shopping.domain.Category;
import shopping.domain.PageBean;
import shopping.domain.Product;
import shopping.service.ProductService;
import shopping.service.impl.CategoryServiceImpl;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@WebServlet(urlPatterns = "/product")
public class ProductServlet extends BaseServlet {
    /**
     * 根据cid和pageNumber 查询某个分类下的某一页数据。
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void page(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String cid = request.getParameter("cid");
        //这段代码在传入的参数为 非数字 字符时 会发生异常，所以要进行异常处理
//        int pageNumber = Integer.parseInt(request.getParameter("pageNumber"));
        /*
            如果没有发生异常，就正常修改pageNumber的值。

            发生异常就默认为1
         */
        int pageNumber =1;
        try {
            pageNumber = Integer.parseInt(request.getParameter("pageNumber"));
        }catch (Exception e){

        }
        //分页，一页显示多少数据，写死
        int pageSize = 6;
        List<Product> products = new ProductService().findByPageWithCid(cid,pageNumber,pageSize);
        /*
            希望实现的 分页效果（以偶数页举例）
            比如显示页码为1-10（10页），开始位置为1，结束位置为10，那么中间位置就是第6页，

            此时点击第7页时，希望第7页处在中间位置，那么此时的开始应该变成2，结束应该变成11，这样第7页仍然处于中间位置。

            所以需要计算出开始和结束的位置，来固定10页（无论选到第几页，前后加起来就是10页）
                比如选到第8页，那么前面应该是3，4，5，6，7，8，9，10，11，12；

            那么此时会出现两种特别情况，
            1. 前面的页数不够：比如选到第2页时，前面的页数为1，就必须将剩下的8页补在后面：1，2，3，4，5，6，7，8，9，10
            2. 后面的页数不够：比如一共有10页，选到第8页，那么前面就要补7页，

            那么开始位置和结束位置怎么计算？
            正常情况下：开始位置 = 当前所在页码 - 前面的页码数量
                      结束位置 = 当前所在 + 后面的页码数量
                比如：共10页，当前处在第3页，那么开始位置就是 3 - 2 = 1；
                     共10页，当前处在第3页，那么结束为止就是 3 + 7 = 10；

             不正常的情况：当前面的元素不够时（要在后面补）
                            开始位置就是 1， 结束位置 = 前面缺失的个数 + 当前页码 + 后面的数
                            比如：1-10， 当前页码 = 2； 那么前面应该+4个数，才能使2到中间位置 ==> 前面缺失的个数=4
                                后面的数：中间位置后面的数，1-10的话，中间位置是6，那么后面的数就是7，8，9，10 = 4
                                所以结束位置 = 前面缺失的数4 + 当前页面2 + 后面的数4 = 10；
                          这里还需要注意，如果结束位置算出来的数 超过了 总页码，那么要选择总页码为结束位置。
                          具体代码看PageBean

             大概懂这个怎么算就行了，反正用的时候都是封装好的。
         */
        //计算分页的开始和结束位置，需要2个信息，总页码和 当前页码pageNumber
        //计算总页码（直接查询cid的数量）
        int count = new ProductService().count(cid);
        PageBean<Product> pb = new PageBean<>();
        pb.setData(products);
        //一页显示最多的个数
        pb.setPageSize(pageSize);
        //当前页码
        pb.setPageNumber(pageNumber);
        //总页码
        pb.setTotal(count);

        success(pb);
    }
    /**
     * 根据id查询商品
     *
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void info(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String pid = request.getParameter("pid");

        Product product = new ProductService().findById(pid);

        //通过product中的cid的，去查询category表
        Category category = new CategoryServiceImpl().findById(product.getCid());

        HashMap<Object, Object> map = new HashMap<>();
        map.put("product", product);
        map.put("category", category);
        success(map);
    }

    /**
     * 查询首页的热门和最新商品信息
     *
     * @param request
     * @param response
     * @throws ServletException
     * @throws IOException
     */
    protected void hotandnews(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //调用Service
        ProductService productService = new ProductService();
        //一个最新商品
        List<Product> news = productService.findNews();
        //一个热门商品
        List<Product> hots = productService.findHots();

        //使用Map集合来处理发送给一个请求但要获取两个数据
        Map<String, List<Product>> map = new HashMap<>();
        map.put("news", news);
        map.put("hots", hots);
        //返回json格式数据
        success(map);
    }

    /**
     * 查询所有商品
     */
    protected void findAll(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        int pageNumber =1;
        try {
            pageNumber = Integer.parseInt(request.getParameter("pageNumber"));
        }catch (Exception e){

        }
        //分页，一页显示多少数据，写死
        int pageSize = 6;
        List<Product> products = new ProductService().findByPage(pageNumber,pageSize);

        //计算分页的开始和结束位置，需要2个信息，总页码和 当前页码pageNumber
        int count = new ProductService().count();
        PageBean<Product> pb = new PageBean<>();
        pb.setData(products);
        //一页显示最多的个数
        pb.setPageSize(pageSize);
        //当前页码
        pb.setPageNumber(pageNumber);
        //总页码
        pb.setTotal(count);

        success(pb);
    }
}
